﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace FrbaCommerce.Comprar_Ofertar
{

    public partial class ListadoPublicaciones: Form
    {
        private string strFiltros, rubroSeleccionado = "";
        private int user_id;
        private DataGridViewRow filaSeleccionada;

        // Page
        private int mintTotalRecords = 0;
        private int mintPageSize = 10;
        private int mintPageCount = 0;
        private int mintCurrentPage = 1;


        private void fillGrid()
        {
            // For Page view.
            //this.mintPageSize = int.Parse(this.bindingNavigator1.Text);
            this.mintTotalRecords = getCount();
            this.mintPageCount = this.mintTotalRecords / this.mintPageSize;

            // Adjust page count if the last page contains partial page.
            if (this.mintTotalRecords % this.mintPageSize > 0)
                this.mintPageCount++;

            this.mintCurrentPage = 0;

            loadPage();
        }

        private int getCount()
        {
            // This select statement is very fast compare to SELECT COUNT(*)

            SqlConnection con = Program.obtenerConexion();

            string strSql = "SELECT DISTINCT pub_cod as 'Código', pub_descripcion as Descripción, pub_stock as Stock, pub_precio as Precio, pub_tipo as 'Tipo', pub_preguntas as 'Permite Preguntas'"
                + " FROM Monkey_Coders.Publicaciones, Monkey_Coders.Rubros_publicaciones, Monkey_Coders.Visibilidades"
                + strFiltros
                + " GROUP BY pub_cod, pub_descripcion, pub_stock,pub_precio,pub_tipo,pub_preguntas, vis_precio";
                
                /*"SELECT Rows FROM SYSINDEXES " +
                            "WHERE Id = OBJECT_ID('Monkey_Coders.Publicaciones') AND IndId < 2";*/

            SqlCommand cmd = new SqlCommand(strSql, con);

            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds, "Monkey_Coders.Publicaciones");

            int intCount = ds.Tables[0].Rows.Count;


            cmd.Dispose();

            return intCount;
        }

        private void loadPage()
        {
            string strSql = "";
            int intSkip = 0;

            SqlConnection con = Program.obtenerConexion();
            intSkip = (this.mintCurrentPage * this.mintPageSize);

            // Select only the n records.

            strSql = "SELECT TOP " + this.mintPageSize +
                " pub_cod as 'Código', pub_descripcion as Descripción, pub_stock as Stock, pub_precio as Precio, pub_tipo as 'Tipo', pub_preguntas as 'Permite Preguntas', (CASE WHEN pub_estado_id = 3 THEN 'Si' ELSE 'No' END) as 'Pausada'"
                + " FROM Monkey_Coders.Publicaciones, Monkey_Coders.Rubros_publicaciones, Monkey_Coders.Visibilidades"
                + strFiltros
                + " AND pub_cod NOT IN " +
                "(SELECT TOP " + intSkip +
                " pub_cod "
                + " FROM Monkey_Coders.Publicaciones, Monkey_Coders.Rubros_publicaciones, Monkey_Coders.Visibilidades"
                + strFiltros
                + " GROUP BY pub_cod, pub_descripcion, pub_stock,pub_precio,pub_tipo,pub_preguntas, pub_estado_id, vis_precio ORDER BY vis_precio)"
                + " GROUP BY pub_cod, pub_descripcion, pub_stock,pub_precio,pub_tipo,pub_preguntas, pub_estado_id, vis_precio ORDER BY vis_precio";


            SqlCommand cmd = new SqlCommand(strSql, con);

            SqlDataAdapter da = new SqlDataAdapter(cmd);

            DataSet ds = new DataSet();
            da.Fill(ds, "Monkey_Coders.Publicaciones");

            // Populate Data Grid
            dataGridView1.DataSource = ds.Tables["Monkey_Coders.Publicaciones"].DefaultView;

            // Show Status
            labelPaginas.Text = (this.mintCurrentPage + 1).ToString() +
              " / " + this.mintPageCount.ToString();

            cmd.Dispose();
            da.Dispose();
            ds.Dispose();
        }





        public ListadoPublicaciones(int user_id)
        {
            this.user_id = user_id;

            InitializeComponent();

        }

        private void buttonBuscar_Click(object sender, EventArgs e)
        {
            dataGridView1.Columns.Clear();

            strFiltros = " WHERE pub_descripcion like '%" + textBoxDesc.Text + "%'"
            + " AND pub_usuario_id != " + user_id + " AND rp_rub_id like '%"+rubroSeleccionado +"%'"
            + " AND rp_pub_id = pub_cod AND pub_stock > 0 AND pub_visibilidad_cod = vis_cod AND (pub_estado_id = 1 OR pub_estado_id = 3)"
            + " AND pub_fecha_inicio <= '" + Program.FechaActual + "' AND pub_fecha_venc >= '" + Program.FechaActual + "'";

            fillGrid();

            DataGridViewButtonColumn btn = new DataGridViewButtonColumn();
            dataGridView1.Columns.Add(btn);
            btn.HeaderText = "Preguntar";
            btn.Name = "boton";
            btn.UseColumnTextForButtonValue = true;

        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {

            if (e.RowIndex < 0 || e.ColumnIndex < 0)
                return;


            filaSeleccionada = dataGridView1.Rows[e.RowIndex];

            if (dataGridView1.Columns[e.ColumnIndex].Name == "boton")
            {

                if ((bool)filaSeleccionada.Cells["Permite Preguntas"].Value)
                {
                    Form pregunta = new FormPreguntar(user_id, filaSeleccionada);
                    pregunta.Show();
                }
            }

            if (filaSeleccionada.Cells["Tipo"].Value.ToString() == "Compra Inmediata")
                {
                    buttonCompOfert.Text = "Comprar";
                    labelCantValor.Text = "Cantidad:";
                    maskedTextBoxCantValor.Text = "1";
                }
                else
                {
                    buttonCompOfert.Text = "Ofertar";
                    labelCantValor.Text = "Valor:";
                    maskedTextBoxCantValor.Text = filaSeleccionada.Cells["Precio"].Value.ToString();
                }

        }


        private void Listado_Load(object sender, EventArgs e)
        {

            Generar_Publicacion.GenerarPublicacion.Rubro rubroTodos = new FrbaCommerce.Generar_Publicacion.GenerarPublicacion.Rubro();
            rubroTodos.desc = "Todos";
            listBoxRubros.Items.Add(rubroTodos);

            Generar_Publicacion.GenerarPublicacion cargaRubros = new Generar_Publicacion.GenerarPublicacion(user_id);
            cargaRubros.CargarRubros(listBoxRubros);
            listBoxRubros.SelectedIndex = 0;

        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void buttonLimpiar_Click(object sender, EventArgs e)
        {
            dataGridView1.Columns.Clear();
        }

        private void buttonPrimera_Click(object sender, EventArgs e)
        {

            this.mintCurrentPage = 0;

            loadPage();
        }

        private void buttonAtras_Click(object sender, EventArgs e)
        {
            if (this.mintCurrentPage == this.mintPageCount)
                this.mintCurrentPage = this.mintPageCount - 1;

            this.mintCurrentPage--;

            if (this.mintCurrentPage < 1)
                this.mintCurrentPage = 0;

            loadPage();
        }

        private void buttonAdelante_Click(object sender, EventArgs e)
        {
            this.mintCurrentPage++;

            if (this.mintCurrentPage > (this.mintPageCount - 1))
                this.mintCurrentPage = this.mintPageCount - 1;

            loadPage();
        }

        private void buttonLast_Click(object sender, EventArgs e)
        {
            this.mintCurrentPage = this.mintPageCount - 1;
            loadPage();
        }


        private void compraInmediata(DataGridViewRow fila)
        {
            SqlConnection con = Program.obtenerConexion();

            //Doy el alta de la compra

            SqlCommand altaCompra = new SqlCommand("INSERT INTO [Monkey_Coders].Compras (com_publicacion_id, com_fecha, com_usuario_comprador_id, com_cant) VALUES (@PubID, @Fecha, @UserID, @Cant)", con);
            altaCompra.Parameters.Add("PubID", SqlDbType.Int, 18).Value = Convert.ToInt32(fila.Cells["Código"].Value);
            altaCompra.Parameters.Add("Fecha", SqlDbType.VarChar, 255).Value = Program.FechaActual;
            altaCompra.Parameters.Add("UserID", SqlDbType.Int, 18).Value = user_id;
            altaCompra.Parameters.Add("Cant", SqlDbType.Int, 18).Value = maskedTextBoxCantValor.Text;

            altaCompra.ExecuteNonQuery();

            //Actualizo la publicacion para restar el Stock
            //Aca para pasarla a finalizada podemos o usar un trigger o actualizar directamente desde acá. Pongo un trigger que me parece un poco mejor
            SqlCommand updatePublicacion = new SqlCommand("UPDATE [Monkey_Coders].Publicaciones SET pub_stock = pub_stock - " + maskedTextBoxCantValor.Text + " WHERE pub_cod = " + Convert.ToInt32(fila.Cells["Código"].Value), con);
            updatePublicacion.ExecuteNonQuery();

            MessageBox.Show("Compra Realizada!");
            buttonBuscar_Click(null,null);

            filaSeleccionada = null;
        
        }

        private void subasta(DataGridViewRow fila)
        {
            SqlConnection con = Program.obtenerConexion();
            String precio = Convert.ToDecimal(maskedTextBoxCantValor.Text).ToString(System.Globalization.CultureInfo.InvariantCulture);
            //Me fijo que haya ofertado mas de lo que vale

            if (Convert.ToDecimal(maskedTextBoxCantValor.Text) < Convert.ToDecimal(filaSeleccionada.Cells["Precio"].Value))
            {
                MessageBox.Show("La oferta no puede ser menor al precio actual", "FRBA-Commerce", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            //Busco el codigo de la subasta segun el de publicación
            SqlCommand subasta = new SqlCommand("SELECT sub_id FROM [Monkey_Coders].Subastas WHERE sub_publicacion_id = " + Convert.ToInt32(fila.Cells["Código"].Value),con);
            SqlDataReader lector = subasta.ExecuteReader();
            lector.Read();
            Int32 sub_id = Convert.ToInt32(lector["sub_id"]);

            lector.Close();
            //Doy el alta de la oferta

            SqlCommand altaCompra = new SqlCommand("INSERT INTO [Monkey_Coders].Ofertas_subasta (ofe_sub_subasta_id, ofe_sub_usuario_id, ofe_sub_monto, ofe_sub_fecha) VALUES (@SubID, @UserID, @Monto, @Fecha)  ; SELECT SCOPE_IDENTITY() ", con);
            altaCompra.Parameters.Add("SubID", SqlDbType.Int, 18).Value = sub_id;
            altaCompra.Parameters.Add("UserID", SqlDbType.Int, 18).Value = user_id;
            altaCompra.Parameters.Add("Monto", SqlDbType.Float, 18).Value = maskedTextBoxCantValor.Text;
            altaCompra.Parameters.Add("Fecha", SqlDbType.VarChar, 255).Value = Program.FechaActual;

            Int32 newID = Convert.ToInt32(altaCompra.ExecuteScalar());
            //Actualizo la publicacion

            SqlCommand updatePublicacion = new SqlCommand("UPDATE [Monkey_Coders].Publicaciones SET pub_precio = " + precio + " WHERE pub_cod = " + Convert.ToInt32(fila.Cells["Código"].Value), con);
            updatePublicacion.ExecuteNonQuery();

            //Seteo el nuevo monto como el ganador

            SqlCommand updateGanadora = new SqlCommand("UPDATE Monkey_Coders.Subastas SET sub_oferta_ganadora_id = " + newID + ",sub_monto_oferta_ganadora = " + precio + " WHERE sub_id = " + sub_id,con);
            updateGanadora.ExecuteNonQuery();
            
            MessageBox.Show("Oferta Realizada!");
            buttonBuscar_Click(null, null);

            filaSeleccionada = null;

        }

        private bool puedeComprar()
        {
            Calificar_Vendedor.ListadoCompras listado = new Calificar_Vendedor.ListadoCompras(user_id, true);
            if (listado.getCount() > 5)
                return false;

            return true;
        }

        private void buttonCompOfert_Click(object sender, EventArgs e)
        {

            if (!puedeComprar())
            {
                MessageBox.Show("Tiene más de 5 operaciones sin calificar, por favor realize las calificaciones correspondientes antes de continuar", "FRBA - Commerce", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (filaSeleccionada == null)
            {
                MessageBox.Show("Seleccione una publicación antes de comprar");
                return;
            }
            if (filaSeleccionada.Cells["Pausada"].Value.ToString() == "Si")
            {
                MessageBox.Show("La compra no se puede realizar ya que la publicación se encuentra pausada","FRBA-Commerce",MessageBoxButtons.OK,MessageBoxIcon.Warning);
                return;
            }
            if (filaSeleccionada.Cells["Tipo"].Value.ToString() == "Compra Inmediata")
                compraInmediata(filaSeleccionada);
            else
                subasta(filaSeleccionada);

        }


        private void maskedTextBoxCantValor_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (filaSeleccionada.Cells["Tipo"].Value.ToString() == "Subasta")
            {
                if (((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8 && e.KeyChar != 44))
                {
                    e.Handled = true;
                    return;
                }

                if (e.KeyChar == 44)
                {
                    if ((sender as TextBox).Text.IndexOf(e.KeyChar) != -1)
                        e.Handled = true;
                }
            }
            else
            e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);

        }



        private void listBoxRubros_SelectedIndexChanged(object sender, EventArgs e)
        {
            rubroSeleccionado = Convert.ToString(((Generar_Publicacion.GenerarPublicacion.Rubro)listBoxRubros.SelectedItem).id);
            if (Convert.ToInt32(rubroSeleccionado) == 0)
                rubroSeleccionado = "";
        }

    }
}
